package com.itheima.security.springboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * springsecurity的配置
 **/
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true) // 加上这个才能在controller层使用权限注解
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 定义用户信息服务（查询用户信息）,基于内存手动定义的配置,现在使用的是查询数据库的方式
     * SpringDataUserDetailsService
     */
/*
    @Bean
    public UserDetailsService userDetailsService(){
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
        manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());
        return manager;
    }
*/

    //密码编码器 不进行加密
    /*@Bean
    public PasswordEncoder passwordEncoder(){
        return NoOpPasswordEncoder.getInstance();
    }*/

    // 使用该方式进行加密算法校验,你用哪种方式进行加密，数据库的密码存的就是哪种加密后的。
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    //安全拦截机制（最重要）
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()//spring security为防止CSRF（跨站请求伪造）的发生，限制了除了get以外的大多数方法,禁用就可以提交post请求了
                .authorizeRequests()
                // web授权 不这么授权可以使用授权注解在Controller层
//                .antMatchers("/r/r1").hasAuthority("p2") //标识有p2的权限可以访问/r/r1
//                .antMatchers("/r/r2").hasAuthority("p2")
                .antMatchers("/r/**").authenticated()//所有/r/**的请求必须认证通过
                .anyRequest().permitAll()//除了/r/**，其它的请求可以访问
                .and()
                .formLogin()//允许表单登录
                .loginPage("/login-view")//登录页面
                .loginProcessingUrl("/login") //在前台表单提交的时候需要提交到的url security内部的。
                .successForwardUrl("/login-success")//自定义登录成功的页面地址 指向自己的Controller的请求
        .and()  //session会话的管理
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 如果需要就创建一个session
                .and()
                .logout()
                .logoutUrl("/logout") //springsecurity自带的
                .logoutSuccessUrl("/login-view?logout");


    }
}
